home *** CD-ROM | disk | FTP | other *** search
/ Network Supervisor's Toolkit / Network Supervisor's Toolkit.iso / printers / iprint / iprint.c < prev    next >
Text File  |  1996-07-10  |  38KB  |  796 lines

  1. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  2. /* Program : IPRINT. Nprint version IRCI                                    */
  3. /* Author  : Marc Chauffour                                                 */
  4. /* Date-written : 02/13/90 02:31pm                                          */
  5. /* Last-updated : 03/13/90 11:11am                                          */
  6. /*                                                                          */
  7. /* Update : 1.10  02/16/90 Copie file server si possible, modification des  */
  8. /*                libelles job decription et path file.                     */
  9. /*          1.11  02/16/90 Possibilite de demander copy standard /NC        */
  10. /*          1.12  02/19/90 Iprint *.LST possible                            */
  11. /*          1.13  02/20/90 FileServerCopy est correcte ou copie standard    */
  12. /*          1.14  02/20/90 On beep si probleme                              */
  13. /*          1.15  02/20/90 Remaniement avec philippe et Test version DOS    */
  14. /*          1.16  02/20/90 Ph.A. buffer de 32Ko                             */
  15. /*          1.17  02/21/90 C.m. Option /S plus affichage progression copy   */
  16. /*          1.18  02/22/90 Affichage taille reellement copiee               */
  17. /*          1.20  02/23/90 /F=forms name avec NET$PRN.DAT                   */
  18. /*          1.21  02/23/90 Preferred, Primary et Default server si echec    */
  19. /*          1.22  03/01/90 Ph.A. Modif libelle                              */
  20. /*        1.23  03/13/90 Teste la presence de NET3, La version de Novell  */
  21. /*          1.24  03/19/90 Ph.A. Modif libelle                              */
  22. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  23. /*                                                                          */
  24. /*                                                                          */
  25. /* IPRINT filename /f=Form_name /c=Copies_number  /q=Queue_name             */
  26. /*                 /t=TabSize  /NT  /NC  /S                                 */
  27. /*                                                                          */
  28. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  29.  
  30.  
  31. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  32. /* Inclusion des headers                                                    */
  33. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  34. #define _NIT_H
  35. #include "z:\novellc\include\nwbindry.h"
  36. #include "z:\novellc\include\nwconn.h"
  37. #include "z:\novellc\include\nwfile.h"
  38. #include "z:\novellc\include\nwmisc.h"
  39. #include "z:\novellc\include\nwwrkenv.h"
  40. #include "z:\novellc\include\nitq.h"
  41. #include "z:\novellc\include\niterror.h"
  42. #include <string.h>
  43. #include <stdlib.h>
  44. #include <io.h>
  45. #include <stdio.h>
  46. #include <conio.h>
  47. #include <dir.h>
  48. #include <fcntl.h>
  49. #include <dos.h>
  50. #include <sys\stat.h>
  51. #include "..\tc\fullypth.h"
  52.  
  53.  
  54. #define CAVAMAL    -1            /* En cas de probleme               */
  55. #define DEFAUT     -1            /* Valeur par defaut                */
  56. #define OK          0            /* Tout est Ok                      */
  57. #define ARGERR      1            /* Argument Error                   */
  58. #define NOSERVER    2            /* Not attached to server           */
  59. #define NOQUEUE     3            /* Queue not found                  */
  60. #define NOPRINTSERV 4            /* No print server                  */
  61. #define NEWJOBERR   5            /* Unable to create new job         */
  62. #define NOFILE      6             /* File not found                   */
  63. #define COPYERR     7             /* File copy error                  */
  64. #define STARTERR    8             /* Start Error                      */
  65. #define VERSERR     9             /* Dos version error                */
  66. #define NOMEM       10            /* Not enough memory to MALLOC.     */
  67. #define NOFRMSF    11            /* No Forms FIle                    */
  68. #define BADFRMSF   12            /* Mauvais fichier NET$PRN.DAT      */
  69. #define ZEROFRMS   13            /* Pas de forms dans le fichier     */
  70. #define UNKNOWNF   14            /* Forms inconnu                    */
  71. #define NONOVELL   15            /* Pas de novell charge             */
  72. #define VERSNOVELL 16            /* Version trop vieille             */
  73.  
  74. #define MAXLINES   66            /* Nombre maxi de lignes            */
  75. #define MAXCHAR   132            /* Nombre maximum de caracteres     */
  76. #define TAILLEBUF  32*1024U        /* Gros Buffer.                     */
  77. #define LENGTHDEF  66              /* Length papier par defaut         */
  78. #define WIDTHDEF  132             /* Width papier par defaut          */
  79. #define SRCHNUM    -2            /* Recherche numerique du form      */
  80. #define SRCHTXT     0            /* recherche par nom du form        */
  81.  
  82. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  83. /* Acces a NET$PRN.DAT Dans PUBLIC                                          */
  84. /* On a tout d'abord une fin de fichier a chercher 0Dh 0Ah 1Ah              */
  85. /* BYTE  - DUP(8) constant                                                  */
  86. /* DWORD - ???                                                              */
  87. /* DWORD - position info Device (Zero si pas de device)                     */
  88. /* DWORD - position indo Forms  (Zero si pas de forms)                      */
  89. /* DWORD - Position de la prochaine place libre                             */
  90. /* DWORD - 00 00 00 00                                                      */
  91. /* -------------------------------------------------------------------------*/
  92. /* Zone FORMS :                                                             */
  93. /* BYTE  - longueur du forms name                                           */
  94. /* BYTE  - DUP(longueur du forms name)                                      */
  95. /* WORD  - numero de forms                                                  */
  96. /* WORD  - width  (largeur de la page)                                      */
  97. /* WORD  - length (nombre de lignes)                                        */
  98. /* BYTE  - DUP(longueur du forms name)                                      */
  99. /* DWORD - position du debut de zone FORMS                                  */
  100. /* DWORD - 00 00 00 00                                                      */
  101. /* BYTE  - 00                                                               */
  102. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  103.  
  104. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  105. /* Variables globales                                                       */
  106. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  107. int nbarg;                /* Nombre d'argument                */
  108. char qdefault[48]="Q_TEXT";        /* Nom de la queue par defaut       */
  109. char ficcfg[80]="/SYS:PUBLIC\\NET$PRN.DAT";
  110. int formsdef=0;                /* forms si rien de specifie        */
  111. char *qname=NULL;            /* Nom de la queue concernee        */
  112. int copy=DEFAUT;            /* Nombre de copie                  */
  113.  
  114. int forms=DEFAUT;            /* Forms pas initialise             */
  115. char formsname[12]="";            /* Nom de forms par defaut          */
  116. int formslength=DEFAUT;             /* Length papier                    */
  117. int formswidth=DEFAUT;            /* width papier                     */
  118.  
  119. int stream=DEFAUT;            /* par defaut text Tabs=O           */
  120. int sizetab=DEFAUT;            /* Tab Size                         */
  121. int copymsg=DEFAUT;            /* Message pendant la phase de copy */
  122. char fullypath[255];            /* Buffer du nom fichier            */
  123. int flagcopy=DEFAUT;            /* copy reseau inhibe               */
  124. char *buffer;                /* Pointeur au buffer de copie.        */
  125.  
  126. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  127. /* Declarations des fonctions                                               */
  128. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  129. int testarg(char **);            /* Teste la liste des arguments     */
  130. int test(char *);            /* Teste un argument                */
  131. int copyfile(int, char *);        /* Copy d'un fichier sur l'autre    */
  132. int traitfile(char *);            /* Traitement d'un fichier          */
  133. int srchfrms( void );            /* on cherche le numero de forms    */
  134. int main(int, char**);            /* Fonction principale              */
  135. int testnovell( void);            /* regarde si novell present        */
  136.  
  137.  
  138. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  139. /* testarg : Verifie si les arguments sont correct                */
  140. /* Sortie : (int)  CAVAMAL - Mauvais argument                    */
  141. /*             0 - Pas de probleme                    */
  142. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  143. int testarg(
  144.     char **listarg)            /* Liste des arguments            */
  145. {
  146. int i;                    /* Compteur de boucle for        */
  147. int nbargu;                /* Nombre d'argument            */
  148.   nbargu = nbarg;            /* Egal au nombre d'argument passe  */
  149.   switch(nbarg) {            /* en fonction du nombre d'argument */
  150.     case 2 :
  151.       if (strncmp("/",listarg[1],1) != 0) /* Si on a un nom de fichier Ok   */
  152.     return(OK);            /* On peut sortir sans probleme     */
  153.       else
  154.     return(CAVAMAL);        /* On peut sortir sans probleme     */
  155.     default :
  156.       if (strncmp("/",listarg[1],1) != 0) /* Si on a un nom de fichier Ok   */
  157.     {
  158.     for (i = 2; i<nbargu; i++)
  159.       if(test(listarg[i]) == CAVAMAL)  /* On teste le premier argument  */
  160.         return(CAVAMAL);        /* On sort avec erreur            */
  161.     return(OK);            /* On sort avec result de TEST        */
  162.     }
  163.       else
  164.         return(CAVAMAL);             /* Pas bon                */
  165.    }
  166. }
  167.  
  168.  
  169. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  170. /* Fonction test                                */
  171. /* Rend CAVAMAL si probleme et Zero autrement                    */
  172. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  173. int test(char *arg)
  174. {
  175.  if (strncmp("/",arg,1) != 0)        /* Si on a un nom de fichier Ok     */
  176.    return(CAVAMAL);            /* Pas de nom de fichier        */
  177.  if (strnicmp("/Q=",arg,3) == 0)    /* Si on demande une Queue specifiq */
  178.    if (qname != NULL)            /* Si on est deja passe         */
  179.      return(CAVAMAL);            /* On sort avec un probleme        */
  180.    else
  181.      if(strlen(&arg[3]) > 0)        /* Si on a quelque chose derriere   */
  182.        {
  183.        qname=&arg[3];            /* on lui met l'adresse qu'il faut  */
  184.        --nbarg;             /* Un argument en moins         */
  185.        return(OK);            /* Ok pas de probleme, on a le droit*/
  186.        }
  187.      else
  188.        return(CAVAMAL);         /* On ne peut pas            */
  189.  
  190. if (stricmp("/NT",arg) == 0)        /* Si on demande un mode stream     */
  191.   if (stream!=DEFAUT)            /* Si on est deja passe         */
  192.     return(CAVAMAL);            /* On sort avec un probleme        */
  193.   else
  194.     {
  195.     stream=0;                /* on lui met le stream            */
  196.     --nbarg;                  /* Un argument en moins         */
  197.     return(OK);                      /* Ok pas de probleme, on a le droit*/
  198.     }
  199.  
  200. if (stricmp("/S",arg) == 0)        /* Si on demande pas d'affic. copy  */
  201.   if (copymsg!=DEFAUT)            /* Si on est deja passe         */
  202.     return(CAVAMAL);            /* On sort avec un probleme        */
  203.   else
  204.     {
  205.     copymsg=0;                /* on lui met le non affichage      */
  206.     --nbarg;                  /* Un argument en moins         */
  207.     return(OK);                      /* Ok pas de probleme, on a le droit*/
  208.     }
  209.  
  210. if (stricmp("/NC",arg) == 0)        /* Si on demande pas NET COPY       */
  211.   if (flagcopy!=DEFAUT)            /* Si on est deja passe         */
  212.     return(CAVAMAL);            /* On sort avec un probleme        */
  213.   else
  214.     {
  215.     flagcopy=1;                /* on lui met le copy standard      */
  216.     --nbarg;                  /* Un argument en moins         */
  217.     return(OK);                /* Ok pas de probleme, on a le droit*/
  218.     }
  219.  
  220.  
  221.  if (strnicmp("/C=",arg,3) == 0)    /* Si on demande nombre de copies   */
  222.    if (copy != DEFAUT)                   /* Si on est deja passe         */
  223.      return(CAVAMAL);            /* On sort avec un probleme        */
  224.    else
  225.      if(strlen(&arg[3]) > 0)        /* Si on a quelque chose derriere   */
  226.        {
  227.        copy=atoi(&arg[3]);        /* On prend notre nombre de copies  */
  228.        if (copy == 0)                /* si n'importe quoi                */
  229.      return(CAVAMAL);        /* on le dit !                      */
  230.        else
  231.      {
  232.          --nbarg;               /* Un argument en moins         */
  233.      return(OK);            /* C'est Ok                         */
  234.      }
  235.        }
  236.      else
  237.        return(CAVAMAL);         /* On ne peut pas            */
  238.  
  239.  
  240.  if (strnicmp("/T=",arg,3) == 0)    /* Si on demande tab size           */
  241.    if (sizetab != DEFAUT)               /* Si on est deja passe         */
  242.      return(CAVAMAL);            /* On sort avec un probleme        */
  243.    else
  244.      if(strlen(&arg[3]) > 0)        /* Si on a quelque chose derriere   */
  245.        {
  246.        sizetab=atoi(&arg[3]);        /* On prend notre nombre de copies  */
  247.        if (sizetab < 0 || sizetab >18 )    /* si n'importe quoi                */
  248.      return(CAVAMAL);        /* on le dit !                      */
  249.        else
  250.      {
  251.          --nbarg;               /* Un argument en moins         */
  252.      return(OK);            /* C'est Ok                         */
  253.      }
  254.        }
  255.      else
  256.        return(CAVAMAL);         /* On ne peut pas            */
  257.  
  258.  
  259.  if (strnicmp("/F=",arg,3) == 0)    /* Si on demande forms              */
  260.    if (forms != DEFAUT)               /* Si on est deja passe         */
  261.      return(CAVAMAL);            /* On sort avec un probleme        */
  262.    else
  263.      if(strlen(&arg[3]) > 0)        /* Si on a quelque chose derriere   */
  264.        if(arg[3]<'0' || arg[3]>'9')    /* Si c'est de l'alphanumerique     */
  265.      {
  266.          strcpy(formsname,&arg[3]);    /* On prend notre forms             */
  267.          --nbarg;               /* Un argument en moins         */
  268.          forms=SRCHTXT;            /* on peut signaler que FORMS name  */
  269.          return(OK);            /* C'est Ok                         */
  270.          }
  271.        else
  272.      {
  273.          formsdef=atoi(&arg[3]);    /* On prend notre forms             */
  274.          forms=SRCHNUM;            /* on peut signaler que FORMS num   */
  275.          --nbarg;               /* Un argument en moins         */
  276.          return(OK);            /* C'est Ok                         */
  277.      }
  278.      else
  279.        return(CAVAMAL);         /* On ne peut pas            */
  280.  return(CAVAMAL);
  281. }
  282.  
  283. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  284. /* copyfile( fichier a editer )                                             */
  285. /* en sortie : Ok si tout va bien                                           */
  286. /*             autrement code erreur                                        */
  287. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  288. int copyfile
  289.     (
  290.     int hdleout,             /* Dos handle fichier OUT           */
  291.     char *nomfichier)            /* Nom du fichier en entree         */
  292. {
  293. int hdlein;                /* Handle fichier In                */
  294. unsigned long longfic;            /* Longeur du fichier IN            */
  295. unsigned long longcopied;        /* longueur deja effectue           */
  296. unsigned long posit=0;            /* Position dans le fichier IN      */
  297. int result;                 /* Resultat des fonctions           */
  298. unsigned long taille=0;            /* Taille en Ko                     */
  299.  
  300.   hdlein=open(nomfichier,
  301.           O_RDONLY|O_DENYNONE|O_BINARY,
  302.           S_IFREG);         /* Ouvre IN en SHARE/READ ONLY        */
  303.   if (hdlein==CAVAMAL)            /* Si le fichier n'existe pas       */
  304.     return(CAVAMAL);            /* on le signale                    */
  305.   longfic=filelength(hdlein);        /* On prend sa taille               */
  306.   if (fullypath[1]==':' || flagcopy==1)    /* Drive local                      */
  307.     result=1;                /* On force la copie maison         */
  308.   else
  309.     {
  310.     longcopied=0;            /* On initialise la longueur copiee */
  311.     printf("Server copy of %lu bytes.",longfic);
  312.     gotoxy(1,wherey());            /* Debut de ligne                   */
  313.     result=FileServerFileCopy(hdlein,hdleout,
  314.              0,0,longfic,       /* si la copie server ne marche pas */
  315.              (long *)&longcopied); /* on va essayer autre chose     */
  316.     }
  317.   printf("                                                 ");
  318.   gotoxy(1,wherey());                   /* Debut de ligne                   */
  319.   if (result!=OK || longcopied!=longfic)/* En cas de probleme               */
  320.     while(posit<longfic)        /* Tant qu'on doit copier           */
  321.       {
  322.       result=read(hdlein,buffer,(unsigned) TAILLEBUF);/* Lecture fichier IN */
  323.       if (result==CAVAMAL)        /* En cas de probleme               */
  324.     {
  325.     close(hdlein);            /* On ferme le fichier              */
  326.     return(CAVAMAL);        /* On le signale dehors             */
  327.     }
  328.       if (write(hdleout,buffer,result)!=result)
  329.     {                /* Disk full.                */
  330.     close(hdleout);
  331.     close(hdlein);            /* on termine                       */
  332.     return(CAVAMAL);        /* On sort avec probleme            */
  333.     }
  334.       posit+=(unsigned int) result;    /* On signale ou on est             */
  335.       taille+=(unsigned) result;    /* Quelques bytes de plus           */
  336.       gotoxy(1,wherey());        /* Debut de ligne                   */
  337.       if (copymsg==DEFAUT) printf("Spooling %lu Kb",taille/1024);
  338.       }
  339.    gotoxy(1,wherey());            /* Debut de ligne                   */
  340.    printf("                                                 ");
  341.    gotoxy(1,wherey());            /* Debut de ligne                   */
  342.    close(hdlein);            /* On ferme notre fichier IN        */
  343.    return(OK);                /* C'est ok                         */
  344. }
  345.  
  346.  
  347.  
  348.  
  349. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  350. /* traitfile( fichier a editer )                                            */
  351. /* en sortie : Ok si tout va bien                                           */
  352. /*             autrement code erreur                                        */
  353. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  354. int traitfile
  355.     (
  356.     char *nomfichier            /* Nom du fichier a editer          */
  357.     )
  358. {
  359. long queueid;                /* ID de la queue demandee          */
  360. JobStruct job;                /* Structure de type Job            */
  361. WORD connect;                /* Connection number                */
  362. int result;                /* Resultat fonction                */
  363. char user[48];                /* Utilisateur                      */
  364. WORD usertype;                /* Type du user                     */
  365. long userid;                /* Object ID                        */
  366. BYTE logintime[7];            /* Login Time                       */
  367. char drive[MAXDRIVE];            /* Unite du disque            */
  368. char dir[MAXDIR];            /* Repertoire                */
  369. char filename[MAXFILE];         /* nom du fichier            */
  370. char ext[MAXEXT];            /* Extension                */
  371. struct ClientRecordArea *pcra;        /* Pointeur a la strcuture          */
  372. int drivenb;                /* Numero de drive            */
  373. char *pdrivenb;             /* pointeur au char drive        */
  374. int filehandle;                /* FIle handle file job             */
  375. struct ftime ftimep;            /* structure informations date:time */
  376. long lgfile;                /* Longueur du fichier              */
  377.   memset(&job,0,sizeof(job));        /* Initialise a zero                */
  378.   filehandle=open(nomfichier,
  379.           O_RDONLY|O_DENYNONE|O_BINARY,
  380.           S_IFREG);         /* Ouvre IN en SHARE/READ ONLY        */
  381.   if(filehandle==CAVAMAL)        /* Si il n'existe pas               */
  382.     {
  383.     printf("File not found : %s\n\7",nomfichier);
  384.     return(NOFILE);
  385.     }
  386.   else
  387.     {
  388.     lgfile=filelength(filehandle);    /* Longueur du fichier              */
  389.     getftime(filehandle,&ftimep);    /* Date de modification fichier     */
  390.     close(filehandle);            /* fichier plus ouvert              */
  391.     }
  392.   if (lgfile==0)            /* ca ne sert a rien                */
  393.     {
  394.     printf("File %s is empty.\n\7",nomfichier);
  395.     return(OK);                /* erreur non critique              */
  396.     }
  397.   if (GetBinderyObjectID(qname, OT_PRINT_QUEUE, &queueid))
  398.     {
  399.     printf("Unable to locate print queue %s\n\7", strupr(qname));
  400.     return(NOQUEUE);
  401.     }
  402.   connect=GetConnectionNumber();    /* Recupere Connection Number       */
  403.   result=GetConnectionInformation(
  404.               connect,    /* par rapport a CONNECT            */
  405.             user,        /* Object name                      */
  406.             &usertype,    /* Type du user                     */
  407.             &userid,    /* User ID                          */
  408.             logintime);    /* Login time                       */
  409.   printf("Submitting %s to %s (user %s).\n",nomfichier,
  410.                                         strupr(qname),
  411.                     user);
  412.   job.targetServerIDNumber=DEFAUT;    /* ID du serveur QUEUE              */
  413.   strcpy(job.targetExecutionTime,"\xFF\xFF\xFF\xFF\xFF\xFF");
  414.   job.jobType=forms;            /* Numero du forms                  */
  415.   fnsplit(nomfichier,drive,dir,filename,ext);
  416.  
  417.   /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  418.   /* Remplissage de la client record Area                                   */
  419.   /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  420. pcra = (struct ClientRecordArea *) job.clientRecordArea;
  421. pcra->version=0;            /* Comme les autres soft            */
  422. pcra->tabsize=sizetab;            /* Position des tabs                */
  423. pcra->copies=IntSwap(copy);        /* Nombre d'exemplaires             */
  424. pcra->cflags=(WORD) (0x80 + 0x40);    /* Banner printed                   */
  425. if (stream!=DEFAUT)            /* Si on a demande le stream        */
  426.   pcra->cflags=(WORD) (0x80);        /* Banner sans text stream          */
  427. pcra->cflags=IntSwap(pcra->cflags);    /* ordre inverse                    */
  428. pcra->maxlines= IntSwap(formslength);    /* Lignes au maximum                */
  429. pcra->maxchar= IntSwap(formswidth);     /* Characteres au maximum           */
  430. strcpy(pcra->formname,formsname);    /* Pas de forms                     */
  431. strncpy(pcra->b_name,user,12);        /* Nom utilisateur                  */
  432. pcra->b_name[13]='\0';            /* On force la fin au cas ou        */
  433. strcpy(pcra->b_filename,filename);    /* Filename sans extension          */
  434. strcat(pcra->b_filename,ext);        /* Voila l'extension                */
  435. strcpy(pcra->h_filename,pcra->b_filename);
  436. sprintf(job.textJobDescription,
  437.           "%s (%lu bytes, %02u-%02u-%04u %02u:%02u)",
  438.                    pcra->b_filename,
  439.                                lgfile,
  440.                    ftimep.ft_month,
  441.                    ftimep.ft_day,
  442.                    ftimep.ft_year+1980,
  443.                    ftimep.ft_hour,
  444.                    ftimep.ft_min);
  445. if (drive[0] == '\0')            /* pas de drive ?            */
  446.   {
  447.   drivenb = getdisk();            /* drive courant            */
  448.   pdrivenb = (unsigned char *)&drivenb; /* adresse drive            */
  449.   drive[0] = (*pdrivenb) + 'A';        /* lettre drive             */
  450.   drive[1] = ':';             /* + ':'                */
  451.   drive[2] = '\0';            /* + zero binaire            */
  452.   }
  453. else
  454.   {
  455.   pdrivenb = drive;            /* lettre drive             */
  456.   drivenb = (int)(pdrivenb[0] - 'A');     /* numero drive                */
  457.   }
  458. strcpy(fullypath,drive);        /* Drive en cours                   */
  459. strcat(fullypath,dir);            /* On a le path du fichier          */
  460. strcat(fullypath,pcra->h_filename);    /* On a le nom complet              */
  461. getnovellpath(fullypath,fullypath);    /* On regarde ce que ca donne       */
  462. strncpy(pcra->path,fullypath,80);
  463. result=CreateQueueJobAndFile(queueid,    /* ID de la queue                   */
  464.                 &job,        /* Pointeur a la structure JOB      */
  465.             &filehandle);    /* DOS file handle pour JobFIle     */
  466. if (result!=OK)                /* Si on a eu des problemes         */
  467.   {
  468.   printf("CreateQueueJobAndFile failed, error %u. Aborted.\n\7",result);
  469.   return(NEWJOBERR);            /* Error level                      */
  470.   }
  471. if(copyfile(filehandle,nomfichier)==CAVAMAL) /* copie des fichiers          */
  472.   {
  473.   printf("Error spooling data to %s \n\7",job.jobFileName);
  474.   CloseFileAndAbortQueueJob(queueid,job.jobNumber,filehandle);
  475.   return(COPYERR);            /* Error level                      */
  476.   }
  477. if (CloseFileAndStartQueueJob(queueid,job.jobNumber,filehandle)==OK)
  478.   return(OK);                /* Pas de probleme                  */
  479. else
  480.   {
  481.   CloseFileAndAbortQueueJob(queueid,job.jobNumber,filehandle);
  482.   printf("CloseFileAndStartQueueJob failed. Aborted.\n\7");
  483.   return(STARTERR);            /* Erreur lors de START             */
  484.   }
  485. }
  486.  
  487.  
  488.  
  489.  
  490. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  491. /* srchfrms : recherche le forms formname dans NET$PRN.DAT                  */
  492. /* le nom du fichier est contenu dans ficcfg[]                              */
  493. /* il faut trouver le nom du preferred server pour lui packer, ou celui     */
  494. /* du Primary server (login), ou le Default server                          */
  495. /* sortie : OK si tout va bien, CAVAMAL autrement                           */
  496. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  497. int srchfrms( void )
  498. {
  499. int fic_in;                /* File handle                      */
  500. int result;                /* resultat des fonctions appelees  */
  501. long longfic;                /* longueur du fichier              */
  502. long i;                    /* indice de boucle                 */
  503. int j;                    /* idem                             */
  504. char nomforms[12];            /* nom du forms                     */
  505. char numforms;                /* Numero de forms                  */
  506. int sizel;                /* Length de la page                */
  507. int sizew;                /* width de la page                 */
  508. int nbcol=4;                /* Nombre de colonne de forms       */
  509.  
  510. char *deplace;                /* pointeur a une chaine de caract. */
  511. int nbforms;                /* Nombre de forms                  */
  512. long *positf;                /* positionnement des forms         */
  513. WORD serverpref;               /* Preferred server                 */
  514. char pluriel='s';            /* singulier ou pluriel ?           */
  515.  
  516. /* on va constituer le nom du fichier NET$PRN.DAT a l'aide du preferred serv*/
  517.   serverpref=GetPreferredConnectionID();
  518.   if (serverpref==0)            /* pas de Set preferred de fait     */
  519.     {
  520.     serverpref=GetPrimaryConnectionID();
  521.     if (serverpref==0)            /* pas de Set preferred de fait     */
  522.       serverpref=GetDefaultConnectionID();
  523.     }
  524.   GetFileServerName(serverpref,        /* connection ID du serveur princip.*/
  525.              fullypath);    /* Nom du serveur                   */
  526.   strcat(fullypath,ficcfg);        /* On lui ajoute le nom du fichier  */
  527.   fic_in=open(fullypath,
  528.           O_RDONLY|O_DENYNONE|O_BINARY,
  529.           S_IFREG);         /* Ouvre IN en SHARE/READ ONLY        */
  530.   if(fic_in==CAVAMAL)            /* En cas de probleme               */
  531.     {
  532.     printf("%s not found.\7\n",fullypath);
  533.     return(NOFRMSF);            /* No forms FIle                    */
  534.     }
  535.   longfic=filelength(fic_in);        /* longueur du fichier              */
  536.   buffer=malloc((size_t) longfic);     /* Alloue le buffer de lecture        */
  537.   if (buffer==NULL)
  538.     {
  539.     printf("Not enough heap memory...\n\7");
  540.     close(fic_in);            /* on libere le fichier             */
  541.     return(NOMEM);            /* Pas assez de memoire             */
  542.     }
  543.   result = read(fic_in,buffer,(int) longfic); /* On charge tout le fichier  */
  544.   if (result!=longfic)            /* si on a pas le compte ...        */
  545.     {
  546.     printf("Bad %s !\7\n",fullypath);
  547.     close(fic_in);            /* on ferme le fichier              */
  548.     free(buffer);            /* on libere la memoire             */
  549.     return(BADFRMSF);            /* On a un probleme                 */
  550.     }
  551.   deplace=buffer;            /* adresse du buffer alloue         */
  552.   for(i=0;*deplace!='\x1A' && i<longfic;i++,deplace++); /* on recherche 1A  */
  553.   if(i==longfic)            /* On est deja a la fin             */
  554.     {
  555.     printf("Bad %s !\7\n",fullypath);
  556.     close(fic_in);            /* on le ferme                      */
  557.     free(buffer);            /* on libere la memoire             */
  558.     return(BADFRMSF);            /* on sort                          */
  559.     }
  560.   deplace+=17;                /* deplacement pour arriver au point*/
  561.                     /* info forms.                      */
  562.   positf=(long *) deplace;               /* on prend position en adr. long   */
  563.  
  564.                     /* si on a pas de FORMS             */
  565.   if (deplace==NULL || (char) buffer[(int) *positf]=='\0')
  566.     {
  567.     printf("No form defined in %s.\7\n",fullypath);
  568.     close(fic_in);            /* on le ferme                      */
  569.     free(buffer);            /* on libere la memoire             */
  570.     return(ZEROFRMS);            /* on sort                          */
  571.     }
  572.   nbforms=(char) buffer[(int) *positf];    /* Nombre de forms                  */
  573.   positf=(long *) &buffer[(int) *positf+2]; /* on prend positionnement +int */
  574.  
  575.   for(i=0;i<nbforms;i++)        /* on va regarder tous les forms    */
  576.     {
  577.     for(j=0;j<(int) buffer[(int)*positf]; j++) /* sur la longueur du forms  */
  578.       nomforms[j]=buffer[(int)*positf+j+1];    /* recopie char par char     */
  579.     nomforms[j++]='\0';            /* fin de chaine                    */
  580.  
  581.     numforms=(int) buffer[(int) *positf+j]; /* numero de forms              */
  582.     j+=2;                /* un integer                       */
  583.     sizew=(int) buffer[(int)*positf+j];    /* Width                            */
  584.     j+=2;                /* un integer                       */
  585.     sizel=(int) buffer[(int)*positf+j];    /* Length                           */
  586.     if (numforms==formsdef && forms==DEFAUT)/* cas specifique du form '0'   */
  587.       {
  588.       forms=formsdef;            /* Numero de forms                  */
  589.       formslength=sizel;        /* on sauve notre length par defaut */
  590.       formswidth=sizew;                   /* on sauve notre width par defaut  */
  591.       strcpy(formsname,nomforms);    /* on sauve notre Nom par defaut    */
  592.       printf("No form specified. Defaulting to form %u (%s)\n",
  593.                   forms,formsname);
  594.       close(fic_in);            /* On ferme le fichier              */
  595.       free(buffer);            /* On libere notre buffer           */
  596.       return(OK);            /* Pas de probleme                  */
  597.       }
  598.     if (numforms==formsdef && forms==SRCHNUM) /*cas specifique de form num  */
  599.       {
  600.       forms=formsdef;            /* Numero de forms                  */
  601.       formslength=sizel;        /* on sauve notre length par defaut */
  602.       formswidth=sizew;                   /* on sauve notre width par defaut  */
  603.       strcpy(formsname,nomforms);    /* on sauve notre Nom par defaut    */
  604.       printf("Using form %u (%s)\n",forms,formsname);
  605.       close(fic_in);            /* On ferme le fichier              */
  606.       free(buffer);            /* On libere notre buffer           */
  607.       return(OK);            /* Pas de probleme                  */
  608.       }
  609.                     /* Si ils sont identiques           */
  610.     if(strcmp(nomforms,formsname)==0 && forms==SRCHTXT)
  611.       {
  612.       forms=numforms;            /* Ok pour ce forms                 */
  613.       formslength=sizel;        /* Length papier                    */
  614.       formswidth=sizew;            /* Width papier                     */
  615.       printf("Using form %u (%s)\n",forms,formsname);
  616.       close(fic_in);            /* On ferme le fichier              */
  617.       free(buffer);            /* On libere notre buffer           */
  618.       return(OK);            /* Pas de probleme                  */
  619.       }
  620.     positf++;                /* On passe au suivant              */
  621.     }
  622.   if (forms==DEFAUT)            /* On a pas specifie de form        */
  623.     {
  624.     forms=formsdef;            /* Ok pour ce form                  */
  625.     formslength=LENGTHDEF;             /* Length papier                    */
  626.     formswidth=WIDTHDEF;         /* Width papier                     */
  627.     printf("Using form %u\n",forms);
  628.     close(fic_in);            /* On ferme le fichier              */
  629.     free(buffer);            /* On libere notre buffer           */
  630.     return(OK);                /* Pas de probleme                  */
  631.     }
  632.   else
  633.     {
  634.     printf("Unknown form.\7");        /* le form est inconnu ! -) LISTE   */
  635.     printf(" Available forms are :\n\n");
  636.     positf=(long *) deplace;               /* on prend positionnement          */
  637.     positf=(long *) &buffer[(int)*positf+2]; /* on prend position + int     */
  638.     for(i=0;i<nbforms;i++)        /* on va lister   tout les forms    */
  639.       {
  640.       for(j=0;j<(int) buffer[(int)*positf]; j++) /* recopie du forms        */
  641.         nomforms[j]=buffer[(int)*positf+j+1];/* charactere par charactere   */
  642.       numforms=(int) buffer[(int)*positf+j+1];/* numero de forms            */
  643.       for(;j<12;j++)
  644.     nomforms[j]=' ';        /* On padde avec des blancs         */
  645.       nomforms[j++]='\0';        /* fin de chaine                    */
  646.  
  647.       if (nbcol==4)            /* si on a deja une ligne pleine    */
  648.     {
  649.     nbcol=0;            /* on recommence a zero
  650.     printf("\n");        /* on saute une ligne               */
  651.     }
  652.       printf("  %5u %s",numforms,nomforms);
  653.       nbcol++;                /* Une colonne en plus              */
  654.       positf++;                /* On passe au suivant              */
  655.       }
  656.     if (forms==1) pluriel=32;
  657.     printf("\n\n  %5u form%c\n",nbforms,pluriel);
  658.     close(fic_in);            /* On libere le fichier             */
  659.     free(buffer);            /* On libere la memoire             */
  660.     return(UNKNOWNF);            /* pas de forms comme indique       */
  661.     }
  662. }
  663.  
  664.  
  665. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  666. /* Procedure principale                                                     */
  667. /*                                                                          */
  668. /* ErrorLevel en sortie : 0 - Tout va bien                                  */
  669. /*            ARGERR      1 - erreur d'argument                             */
  670. /*            NOSERVER    2 - Pas attache au serveur                        */
  671. /*            NOQUEUE     3 - Pas de queue                                  */
  672. /*            NOPRINTSERV 4 - Pas de print server                           */
  673. /*            NEWJOBERR   5 - Erreur de creation de job                     */
  674. /*            NOFILE      6 - Pas de fichier                                */
  675. /*            COPYERR     7 - Erreur lors de la copie                       */
  676. /*            STARTERR    8 - Erreur lors de la validation du JOB           */
  677. /*            VERSERR     9 - Version DOS trop vieille                      */
  678. /*          NOMEM     10 - Pas assez de memoire (erreur MALLOC).         */
  679. /*          NOFRMSF    11 - pas de fichier NET$PRN.DAT                    */
  680. /*          BADFRMSF   12 - Mauvais fichier NET$PRN.DAT                   */
  681. /*          ZEROFRMS   13 - Pas de form dans NET$PRN.DAT                  */
  682. /*          UNKNOWNF   14 - Form inconnu                                  */
  683. /*          NONOVELL   15 - Pas de novell charge                */
  684. /*          VERSNOVELL 16 - Netware trop vieux.                */
  685. /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
  686. int main
  687.      (
  688.      int argc,                 /* Nombre d'arguments               */
  689.      char **arg                /* Pointeur aux arguments           */
  690.      )
  691. {
  692. int retour;                /* Resultat des Fonctions           */
  693. char *mask="*.LST";            /* Par defaut si pas de fichier     */
  694. char path[MAXPATH];            /* nom du fichier a traiter         */
  695. char drive[MAXDRIVE];            /* Unite                            */
  696. char dir[MAXDIR];            /* Repertoire                       */
  697. char filename[MAXFILE];         /* nom du fichier            */
  698. char ext[MAXEXT];            /* Extension                */
  699. struct ffblk c_file;
  700. char work[1];                /* Chaine de travail                */
  701. BYTE majorvers;                /* Novell major version             */
  702. BYTE minorvers;                /* Novell minor version             */
  703. BYTE revisionl;                /* revision level                   */
  704.     nbarg = argc;            /* Nombre d'argument            */
  705.     retour = testarg(arg);        /* On teste nos arguments        */
  706.  
  707.     printf("IPRINT - Net Print file   V 1.24  %s  C.m. I.R.C.I. \n\n",__DATE__);
  708.     work[0]=_osmajor;
  709.     work[1]=_osminor;
  710.     if (work[0] < '\3')
  711.       {
  712.       printf("IPRINT requires a DOS 3.00 or later...(current is %u.%u)\n\7",
  713.               (int) work[0],
  714.         (int) work[1]);
  715.       return(VERSERR);
  716.       }
  717.     if(testnovell()!=OK || GetNetWareShellVersion(&majorvers,
  718.                                   &minorvers,
  719.                               &revisionl)==0)
  720.       {
  721.       printf("NET shell not loaded.\n\7");
  722.       return(NONOVELL);
  723.       }
  724.     if (majorvers<2 || (majorvers>1 && minorvers<10))
  725.       {
  726.       printf("IPRINT requires NW 2.10 or later...(This one is %u.%u.%c)\n\7",
  727.               (int) majorvers,
  728.         (int) minorvers,
  729.         (char) revisionl+'A');
  730.       return(VERSNOVELL);
  731.       }
  732.     if (nbarg==2)            /* Si iprint /f=0 /...              */
  733.       mask=arg[1];            /* Parametre passe au programme     */
  734.     if (nbarg != 2 || retour == CAVAMAL) /* Si on a pas trop d'argument     */
  735.       {
  736.       puts("Usage       : IPRINT file_spec [options..]");
  737.       puts("              File_spec may be generic.");
  738.       puts(" ");
  739.       puts("Options are :            Default");
  740.       puts(" ");
  741.       printf("      File extension      [.LST]\n");
  742.       printf("      /F=Form name/number [%u]\n",formsdef);
  743.       printf("      /Q=Queue name       [%s]\n",qdefault);
  744.       puts("      /C=number of Copies [1]");
  745.       puts("      /T=Tab size         [8]");
  746.       puts("      /NT No tabs");
  747.       puts("      /NC Inhibit internal server copy");
  748.       puts("      /S  Silent mode. Suppress copy progression display");
  749.       puts(" ");
  750.       retour=ARGERR;                 /* Arg error              */
  751.       }
  752.     else
  753.       {
  754.       retour=srchfrms();        /* Met les forms par defaut         */
  755.       if (retour!=OK) return(retour);    /* On rend l'errorlevel             */
  756.       if(qname==NULL)            /* Si on a pas specifie de Queue    */
  757.     qname=qdefault;            /* On lui met la QUEUE par defaut   */
  758.       if(copy==DEFAUT)            /* Nombre d'exemplaires             */
  759.     copy=1;                /* defaut 1 exemplaire              */
  760.       if(forms==DEFAUT)            /* Forms par defaut                 */
  761.     forms=0;            /* Defaut par forms                 */
  762.       if(sizetab==DEFAUT)        /* Tab size par defaut              */
  763.     sizetab=8;            /* Defaut pour tab size             */
  764.       fnsplit(mask,drive,dir,filename,ext); /* Decoupage du nom du fichier  */
  765.       if (ext[0]=='\0')
  766.     strcpy(ext,".LST");        /* Normal, ensuite on mettra *.LST  */
  767.       if (filename[0]=='\0')        /* Si on a rien mis                 */
  768.     strcpy(filename,"*");        /* Caractere generique              */
  769.       fnmerge(path,drive,dir,filename,ext);
  770.       if (findfirst(path,&c_file,0)!=CAVAMAL)
  771.     {
  772.     buffer=malloc((size_t) TAILLEBUF);/* Alloue le buffer de copie.        */
  773.     if (buffer==NULL)
  774.       {
  775.       printf("Not enough heap memory...\n\7");
  776.       return(NOMEM);
  777.       }
  778.     do
  779.       {
  780.       fnsplit(c_file.ff_name,work,work,filename,ext);
  781.       fnmerge(path,drive,dir,filename,ext);
  782.       retour=traitfile(strupr(path)); /* On traite le fichier path        */
  783.       }
  784.     while (findnext(&c_file)!=CAVAMAL && retour==0);
  785.     free(buffer);
  786.     }
  787.       else
  788.     {
  789.     printf("File %s not found.\n\7",strupr(path));
  790.     retour=NOFILE;            /* Error level                      */
  791.     }
  792.       }
  793.     return(retour);            /* On sort avec errorlevel        */
  794. }
  795.  
  796.